/**
 * 通用JS方法封装处理
 */
(function ($) {

  /** 消息状态码 */
  let web_status = {
    SUCCESS: "SUCCESS",
    FAIL: "ERROR"
  };

  /**
   * 日期格式化
   */
  Date.prototype.format = function (format) {
    var args = {
      "M+": this.getMonth() + 1,
      "d+": this.getDate(),
      "h+": this.getHours(),
      "m+": this.getMinutes(),
      "s+": this.getSeconds(),
      "q+": Math.floor((this.getMonth() + 3) / 3),  //quarter
      "S": this.getMilliseconds()
    };
    if (/(y+)/.test(format))
      format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var i in args) {
      var n = args[i];
      if (new RegExp("(" + i + ")").test(format))
        format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? n : ("00" + n).substr(("" + n).length));
    }
    return format;
  };

  /**
   * 数组去重
   */
  Array.prototype.distinct = function () {
    var new_arr=[];
    for(var i = 0; i < this.length; i++) {
      var items=this[i];
      if($.inArray(items,new_arr) === -1) {
        new_arr.push(items);
      }
    }
    return new_arr;
  };

  /**
	 *  参数说明：
	 *  prefix：前缀，默认值","，例如：设定prefix='index_'，获取表单 <input name="123index_username"> 时，会过滤掉name属性'index_'之前的内容，所以最终取值为{username:''}
	 */
  var defaultSetting = {
    prefix:''
  };

  /** 生成 setting，合并 defaultSetting 与 setting */
  function generateSetting(setting){
    setting = ($.type(setting) === 'object' && !$.isEmptyObject(setting)) ? setting : {};
    return $.extend({},defaultSetting, setting);
  }

  /**
   * 生成 Json key，移除 name 的前缀和后缀
   */
  function generateKey(name,setting){
    // 前缀不为空时，移除前缀
    if (setting.prefix !== '') {
      name = name.replace(setting.prefix, '');
    }
    return name;
  }

  /**
   * jquery方法拓展
   */
  $.extend({
    // 表单封装处理
    form: {
      // 表单重置
      reset: function(formId, lock) {
        var form = $("#" + formId);
        form[0].reset();
        if (lock) {
          form.css("pointer-events", 'none');
          form.find("input[type='hidden']").val('');
        }
      },
      // 获取选中复选框项
      selectCheckeds: function(name) {
        var checkeds = "";
        $('input:checkbox[name="' + name + '"]:checked').each(function(i) {
          if (0 === i) {
            checkeds = $(this).val();
          } else {
            checkeds += ("," + $(this).val());
          }
        });
        return checkeds;
      },
      // 判断页面select标签被选中数量
      selectedCount: function(){
        var i = 0;
        $(".weui-select").each(function () {
          if ($(this).val()) {
            i++;
          }
        });
        return i;
      },
      // 解除FROM锁定
      unlock: function (formId) {
        $("#" + formId).css("pointer-events", '');
      }
    },
    // 弹出层封装处理
    box: {
      // toptip
      toptip: function (text, duration, type) {
        $.toptip(text, duration, type);
      },
      // toptip成功
      toptip_s: function (text) {
        $.box.toptip(text ? text : '操作成功',1800, 'success');
      },
      // toptip失败
      toptip_f: function (text) {
        $.box.toptip(text ? text : '系统错误',1800, 'error');
      },
      // toptip警告
      toptip_w: function (text) {
        $.box.toptip(text ? text : '警告',1800, 'warning');
      },
      confirm: function (content, title, success, fail) {
        $.confirm(content, title, success, fail);
      },
      toast_s: function (text) {
        $.toast(text ? text : '操作成功');
      },
      // toptip失败
      toast_f: function (text) {
        $.toast(text ? text : '系统错误','forbidden');
      },
      // toptip警告
      toast_t: function (text) {
        $.toast(text ? text : '操作成功', "text");
      }
    },
    // 操作封装处理
    operate: {
      /** jquery ajax 请求 */
      ajax: function (options) {
        let defaults = {
          url: '',
          type: 'post',
          traditional: true,            // 阻止深度序列化， 使参数可以使用数组
          dataType: 'json',
          contentType: "application/x-www-form-urlencoded",
          data: {},
          async: true,                // 异步执行
          success: function (result) {
            if (result.type === web_status.SUCCESS) {
              options.fun(result);
            } else {
              $.box.toptip_w(result.msg);
            }
          },
          error: function () {
            $.box.toptip_f();
          }
        };
        let opt = $.extend(defaults, options);
        $.ajax(opt);
      },
      /** ajax post 请求 */
      post: function (options) {
        $.operate.ajax(options);
      },
      /** ajax get 请求 */
      get: function (options) {
        let defaults = {
          type: 'get'
        };
        let opt = $.extend(defaults, options);
        $.operate.ajax(opt);
      },
      /** 使用 html5 FormData 提交请求 */
      submit: function (options) {
        let defaults = {
          processData: false,
          contentType: false
        };
        let opt = $.extend(defaults, options);
        $.operate.post(opt);
      },
      /** 带确认提示的 html5 FormData 请求 */
      confirmSubmit: function (options) {
        $.box.confirm(options.content, options.title, function () {
          $.operate.submit(options);
        })
      },
      /** 需验证的 html5 FormData 提交 */
      validSubmit: function (options) {
        if (!options.form.validForm(options.content, options.style)) {
          return false;
        }
        $.operate.submit(options);
      },
    },
    // 校验封装处理
    validate: {
      _from : {},
      // 验证初始化
      init: function (formId, option) {
        $.validate._form = $("#" + formId);
        var _option = {
          feedbackIcons: {
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
          }
        };
        $.validate._form.bootstrapValidator($.extend({},_option,option));
      },
      // 表单验证
      validing: function () {
        $.validate._form.bootstrapValidator('validate');
      },
      // 是否验证成功
      isValid: function(){
        $.validate._form.bootstrapValidator('validate');
        return $.validate._form.data('bootstrapValidator').isValid();
      },
      reset: function () {
        $.validate._form.data('bootstrapValidator').resetForm();
      }
    },
    // 通用方法封装处理
    common: {
      // 判断字符串是否为空
      isEmpty: function (value) {
        return value == null || this.trim(value) === "";
      },
      // 判断一个字符串是否为非空串
      isNotEmpty: function (value) {
        return !$.common.isEmpty(value);
      },
      // 空格截取
      trim: function (value) {
        if (value == null) {
          return "";
        }
        return value.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
      },
      // 指定随机数返回
      random: function (min, max) {
        return Math.floor((Math.random() * max) + min);
      },
      // 时间天数差
      diffDay: function (startDate, endDate) {
        var sd = new Date(Date.parse(startDate.replace(/-/g, "/")));
        var sd_str = new Date(sd.format('yyyy-MM-dd'));
        s = new Date(sd_str);
        var ed = new Date(Date.parse(endDate.replace(/-/g, "/")));
        var ed_str = new Date(ed.format('yyyy-MM-dd'));
        e = new Date(ed_str);
        var diffMilli = e.getTime() - s.getTime();//时间差的毫秒数
        var diffDay = diffMilli / (24 * 3600 * 1000);//计算出相差天数
        return diffDay + 1;
      },
      // 时间天数差
      diffHour: function (startDate, endDate) {
        var s = new Date(startDate);
        var e = new Date(endDate);
        var diffMilli = e.getTime() - s.getTime();//时间差的毫秒数
        var diffHour = Math.ceil(diffMilli / (3600 * 1000));//计算出相差天数
        return diffHour;
      },
        /** 时间差 排除中午 11：30 到 12：30 */
        diffHourExtend: function (startDate, endDate) {
            var s = new Date(startDate);
            var e = new Date(endDate);
            var a = new Date(startDate);
            a.setHours(11);
            a.setMinutes(30);
            var b = new Date(startDate);
            b.setHours(12);
            b.setMinutes(30);
            var h = 0;
            if (s <= a && e > a) {
                if (e <= b) {
                    return $.common.diffHour(s, a);
                } else {
                    return $.common.diffHour(s, e) - 1;
                }
            }else if (s >= a && s < b) {
                if (e <= b) {
                    return 0;
                } else {
                    return $.common.diffHour(b, e);
                }
            } else {
                return $.common.diffHour(s, e);
            }
        },
      /**
       * jquery goUp 插件封装
       */
      goTop: function () {
        $.goup({
          trigger: 100,
          bottomOffset: 20,
          locationOffset: 20,
          title: '返回顶部',
          titleAsText: true
        });
      }
    }
  });

  /**
   * jquery对象拓展
   */
  $.fn.extend({
    /**
     * 表单验证， 验证表单内标签属性包含 data-required  为必填项
     * @param content 提示内容
     * @param tip 样式提示
     * @returns {boolean} 验证是否通过
     */
    'validForm':function (content,tip) {
      let root = this;
      let ok = true;

      function _check(obj, t) {
        if (!obj.val()) {
          if (t === true) {
            obj.parent().next(".weui-cell__ft").remove();
            obj.parent().parent().removeClass("weui-cell_warn");
            obj.parent().after('<div class="weui-cell__ft"><i class="weui-icon-warn"></i></div>');
            obj.parent().parent().addClass("weui-cell_warn");
          }
          ok = false;
        } else {
          if (t === true) {
            obj.parent().next(".weui-cell__ft").remove();
            obj.parent().parent().removeClass("weui-cell_warn");
          }
        }
      }

      $(":text,:password,textarea", root).each(function () {
        var _validate = $(this).attr("data-required");
        if (_validate) {
          $(this).off("blur").blur(function () {
            _check($(this), tip);
          });
          _check($(this), tip);
        }
      });
      if (!ok) {
        $.box.toptip_w(content ? content : "请输入内容");
      }
      return ok;
    },
    // 填充数据
    'fillSpan':function(jsonData,setting){
      // 获取表单元素
      var formElements = $(this).find("span");
      // 参数设置
      setting = generateSetting(setting);

      // 传入的json数据非空时
      if (jsonData && $.type(jsonData) === 'object' && !$.isEmptyObject(jsonData)) {

        var repeatJson = {};

        // 遍历容器内所有表单元素
        formElements.each(function(){
          // 表单元素名称
          var name = $(this).attr("id");
          if (!name) {
            return true;
          }
          // jsonData key 值（移除 name 的前缀和后缀）
          var key = generateKey(name,setting);

          if (repeatJson[name]) {
            return true;
          }

          if (jsonData.hasOwnProperty(key)){
            $(this).text(jsonData[key]);
            repeatJson[name] = true;
          }
        });
      }
      return $(this);
    },
    // 填充数据
    'fillData':function(jsonData,setting){
      // 获取表单元素
      var formElements = $(this).find(":input:not(:file):not(:image):not(:reset):not(:button):not(:submit)[name]");
      // 参数设置
      setting = generateSetting(setting);

      // 传入的json数据非空时
      if (jsonData && $.type(jsonData) === 'object' && !$.isEmptyObject(jsonData)) {

        var repeatJson = {};

        // 遍历容器内所有表单元素
        formElements.each(function(){
          // 表单元素名称
          var name = $(this).attr("name");
          if (!name) {
            return true;
          }
          // jsonData key 值（移除 name 的前缀和后缀）
          var key = generateKey(name,setting);

          if (repeatJson[name]) {
            return true;
          }

          if (jsonData.hasOwnProperty(key)){
            // 当表单元素为 radio 时
            if ($(this).is(":radio")) {
              // 取消 radio 选中状态
              formElements.filter(":radio[name='"+name+"']").prop("checked",false);
              // 选中 radio
              formElements.filter(":radio[name='"+name+"'][value="+jsonData[key]+"]").prop("checked",true);
            }
            // 当表单元素为 checkbox 时
            else if ($(this).is(":checkbox")){
              // 取消 checkbox 选中状态
              formElements.filter(":checkbox[name='"+name+"']").prop("checked",false);
              var checkBoxData = jsonData[key];
              if ($.type(checkBoxData) === 'array'){
                $.each(checkBoxData, function(i, val){
                  formElements.filter(":checkbox[name='"+name+"'][value="+val+"]").prop("checked",true);
                });
              }
              else if($.type(checkBoxData) === 'string'){
                $.each(checkBoxData.split(setting.separator), function(i, val){
                  formElements.filter(":checkbox[name='"+name+"'][value="+val+"]").prop("checked",true);
                });
              }
              else {
                formElements.filter(":checkbox[name='"+name+"'][value="+checkBoxData+"]").prop("checked",true);
              }
            }
            // 其他情况
            else {
              $(this).val(jsonData[key]);
            }

            repeatJson[name] = true;
          }
        });
      }
      return $(this);
    }
  });

})(jQuery);



